package de.hdu.pms.dao;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.junit.Test;

import de.hdu.pms.model.Basis;
import de.hdu.pms.model.Mitarbeiter;
import de.hdu.pms.model.Arbeitstag;

public class ArbeitstagDaoTest extends AbstractDataAccessTest {

	public static Logger Log = Logger.getLogger(BasisDaoTest.class);

	public static void setLog(Logger log) {
		Log = log;
	}

	private MitarbeiterDao mitarbeiterDao = null;
	private ArbeitstagDao arbeitstagDao = null;
	private BasisDao basisDao = null;

	private String tableName = "arbeitstag";
	private String tableMitarbeiter = "mitarbeiter";
	private String tableBasis = "basis";

	public void setMitarbeiterDao(MitarbeiterDao mitarbeiterDao) {
		this.mitarbeiterDao = mitarbeiterDao;
	}

	public void setArbeitstagDao(ArbeitstagDao arbeitstagDao) {
		this.arbeitstagDao = arbeitstagDao;
	}

	public void setBasisDao(BasisDao basisDao) {
		this.basisDao = basisDao;
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testFindById() {
		Log.info("UnitTest - Arbeitstag - FindById");
		String[] tables = { tableName };
		String[] tmitarbeiter = { tableMitarbeiter };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
		Basis basis = new Basis();
		basis.setBasis_bez("test");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		Arbeitstag arbeitstag = new Arbeitstag();
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 9);
		calendar.set(Calendar.MONTH, 9);
		calendar.set(Calendar.YEAR, 2012);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		arbeitstag.setAtag_von(calendar.getTime());
		arbeitstag.setAtag_bis(calendar.getTime());
		arbeitstag.setAtag_datum(calendar.getTime());
		arbeitstag.setMitarbeiter(mitarbeiter);
		arbeitstagDao.save(arbeitstag);

		List<Arbeitstag> alleArbeitstage = arbeitstagDao.findAll();
		for (Arbeitstag a : alleArbeitstage) {
			int id = a.getId();
			Arbeitstag found = arbeitstagDao.findById(id);
			assertEquals(a.getId(), found.getId());
			assertEquals(a.getAtag_datum(), found.getAtag_datum());
			assertEquals(a.getAtag_von(), found.getAtag_von());
			assertEquals(a.getAtag_bis(), found.getAtag_bis());
		}
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
	}

	@Test
	public void testFindAll() {
		Log.info("UnitTest - Arbeitstag - FindAll");
		// Wurde bereits in testFindById() getestet
		testFindById();
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testSave() {
		Log.info("UnitTest - Arbeitstag - Save");
		String[] tables = { tableName };
		String[] tmitarbeiter = { tableMitarbeiter };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
		Basis basis = new Basis();
		basis.setBasis_bez("test");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		Arbeitstag arbeitstag = new Arbeitstag();
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 9);
		calendar.set(Calendar.MONTH, 9);
		calendar.set(Calendar.YEAR, 2012);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		arbeitstag.setAtag_von(calendar.getTime());
		arbeitstag.setAtag_bis(calendar.getTime());
		arbeitstag.setAtag_datum(calendar.getTime());
		arbeitstag.setMitarbeiter(mitarbeiter);
		arbeitstagDao.save(arbeitstag);

		int rows = countRowsInTable(tableName);
		assertEquals("Es darf nur ein Datensatz vorhanden sein", 1, rows);
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testDelete() {
		Log.info("UnitTest - Arbeitstag - Delete");
		String[] tables = { tableName };
		String[] tmitarbeiter = { tableMitarbeiter };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
		Basis basis = new Basis();
		basis.setBasis_bez("test");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		Arbeitstag arbeitstag = new Arbeitstag();
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 9);
		calendar.set(Calendar.MONTH, 9);
		calendar.set(Calendar.YEAR, 2012);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		arbeitstag.setAtag_von(calendar.getTime());
		arbeitstag.setAtag_bis(calendar.getTime());
		arbeitstag.setAtag_datum(calendar.getTime());
		arbeitstag.setMitarbeiter(mitarbeiter);
		arbeitstagDao.save(arbeitstag);
		try {
			arbeitstagDao.delete(arbeitstag);
		} catch (Exception e) {
			Log.info("Exception: " + e.getCause());
		}
		List<Arbeitstag> alle = arbeitstagDao.findAll();
		assertEquals(0, alle.size());
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);

	}

	@SuppressWarnings("deprecation")
	@Test
	public void testFindByDate() {
		Log.info("UnitTest - Arbeitstag - FindByDate");
		String[] tables = { tableName };
		String[] tmitarbeiter = { tableMitarbeiter };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
		Basis basis = new Basis();
		basis.setBasis_bez("test");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		Arbeitstag arbeitstag = new Arbeitstag();
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 9);
		calendar.set(Calendar.MONTH, 9);
		calendar.set(Calendar.YEAR, 2012);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		arbeitstag.setAtag_von(calendar.getTime());
		arbeitstag.setAtag_bis(calendar.getTime());
		arbeitstag.setAtag_datum(calendar.getTime());
		arbeitstag.setMitarbeiter(mitarbeiter);
		arbeitstagDao.save(arbeitstag);

		Date datum = calendar.getTime();

		assertEquals(datum, arbeitstagDao
				.findByDate(datum, mitarbeiter.getId()).getAtag_datum());

		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testFindCron() {
		Log.info("UnitTest - Arbeitstag - FindByDate");
		String[] tables = { tableName };
		String[] tmitarbeiter = { tableMitarbeiter };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		deleteFromTables(tmitarbeiter);
		deleteFromTables(tbasis);
		Basis basis = new Basis();
		basis.setBasis_bez("test");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		Arbeitstag arbeitstag = new Arbeitstag();
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 9);
		calendar.set(Calendar.MONTH, 9);
		calendar.set(Calendar.YEAR, 2012);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		Date datumCron = calendar.getTime();
		arbeitstag.setAtag_von(calendar.getTime());
		arbeitstag.setAtag_datum(calendar.getTime());
		arbeitstag.setMitarbeiter(mitarbeiter);
		arbeitstagDao.save(arbeitstag);

		calendar.set(Calendar.DATE, 10);
		calendar.set(Calendar.MONTH, 9);
		calendar.set(Calendar.YEAR, 2012);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		Date datum = calendar.getTime();

		List<Arbeitstag> cron = arbeitstagDao.findCron(datum);
		for (Arbeitstag a : cron) {
			assertEquals(datumCron, a.getAtag_datum());
			assertEquals(mitarbeiter.getId(), a.getMitarbeiter().getId());
			assertEquals(null, a.getAtag_bis());
		}

	}
}
